package com.gzzz;

import com.gzzz.bean.Input;
import com.gzzz.factory.InputBeanFactory;
import com.gzzz.output.FileOutput;
import com.gzzz.shift.CircleShift;
import com.gzzz.sort.BucketSortString;
import com.gzzz.sort.HeapSortString;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * className: main
 * Package : com.gzzz
 * Description:
 *
 * @Author gzzz
 * @Create 2023/12/5 0:55
 * @Version 1.0
 */
public class ProgramStarter {
    public static void main(String[] args) {
        /**
         * 使用命令行传入参数直接调用本地传入功能
         */
        if (args.length > 0) {
            /**
             * 接收输入路径，输出文件目录和输出文件名
             */
            String inputPath = args[0];
            String outPath = args[1];
            String fileName = args[2];
            String filePath = outPath +"\\"+ fileName;

            Input localFileInput = InputBeanFactory.createLocalFileInput(inputPath);
            if (localFileInput != null) {
                sortFromInput(localFileInput,filePath);
            }
        }
        /**
         * 如果不用命令行带参数启动，提供传入方式选择功能
         */
        else {
            Scanner scan = new Scanner(System.in);
            // System.out.println("工作目录：" + System.getProperty("user.dir"));

            System.out.println("请输入文件传入方式: 1：本地文件   2.socket传入  3.消息队列传入    4.数据库传入");
            int choice;
            do {
                System.out.print("请输入一个1到4之间的整数: ");
                // 检查输入是否为整数
                while (!scan.hasNextInt()) {
                    System.out.println("输入无效，请输入一个整数。");
                    System.out.print("请输入一个1到4之间的整数: ");
                    scan.next(); // 清除缓冲区的无效输入
                }
                choice = scan.nextInt();
                // 检查输入是否在1到4之间
                if (choice < 1 || choice > 4) {
                    System.out.println("输入无效，请输入一个1到4之间的整数。");
                }
            } while (choice < 1 || choice > 4);
            // 关闭Scanner
            // scan.close();

            Input input = null;

            switch (choice) {
                case 1:
                    System.out.println("请指定输入文件地址（绝对路径），如： E:\\Project\\1311software\\src\\main\\resources\\a.txt");
                    Scanner scan1 = new Scanner(System.in);
                    String path = scan1.nextLine();
                    input = InputBeanFactory.createLocalFileInput(path);
                    break;

                case 2:
                    System.out.println("socket服务器已开启，端口号为9090...");
                    System.out.println("请启动socket客户端...");
                    input = InputBeanFactory.createSocketInput();
                    break;

                case 3:
                    System.out.println("消息队列采用 Kafka 进行实现");
                    System.out.println("请启动测试类 TestKafka.class 进行测试(需要docker环境)");
                    break;

                case 4:
                    System.out.println("远程数据库服务已开启。");
                    input = InputBeanFactory.createDatabaseInput();
                    break;

                default:
                    System.out.print("输入不符合规范，请重新输入");
                    return;
            }
            if (input != null) {
                sortFromInput(input,null);
            }
            // 关闭Scanner
            scan.close();
        }
    }

    public static void sortFromInput(Input input,String filePath) {
        InputStream inputStream = input.read();
        ArrayList<String> res = CircleShift.shift(inputStream);
        //排序
        ArrayList<String> sortOutput;
        if((res.size()) > 1000) {
            sortOutput = HeapSortString.sort(res);
        }
        sortOutput = BucketSortString.sort(res);
        // 输出
        FileOutput.writeListToFile(sortOutput,filePath);
    }
}
